Return to start page

Core/Environment/Struct Damage Recorder.j

Code

		
1			library AStructCoreEnvironmentDamageRecorder requires optional ALibraryCoreDebugMisc, AStructCoreGeneralHashTable
2
3 /// @todo Should be a part of struct @struct ADamageRecorder, vJass bug.
4 function interface ADamageRecorderOnDamageAction takes ADamageRecorder damageRecorder returns nothing
5
6 /**
7 * Provides damage recording functionality for a single target.
8 * The user is able to get all damage.
9 */
10 struct ADamageRecorder
11 //dynamic members
12 private ADamageRecorderOnDamageAction m_onDamageAction
13 //start members
14 private unit m_target
15 //members
16 private AUnitVector m_damageSources
17 private ARealVector m_damageAmounts
18 private trigger m_damageTrigger
19
20 //! runtextmacro optional A_STRUCT_DEBUG("\"ADamageRecorder\"")
21
22 //dynamic members
23
24 public method setOnDamageAction takes ADamageRecorderOnDamageAction onDamageAction returns nothing
25 set this.m_onDamageAction = onDamageAction
26 endmethod
27
28 public method onDamageAction takes nothing returns ADamageRecorderOnDamageAction
29 return this.m_onDamageAction
30 endmethod
31
32 //start members
33
34 public method target takes nothing returns unit
35 return this.m_target
36 endmethod
37
38 //members
39
40 public method damageSource takes integer index returns unit
41 debug call this.checkIndex(index)
42 return this.m_damageSources[index]
43 endmethod
44
45 public method damageAmount takes integer index returns real
46 debug call this.checkIndex(index)
47 return this.m_damageAmounts[index]
48 endmethod
49
50 public method damageCount takes nothing returns integer
51 return this.m_damageSources.size()
52 endmethod
53
54 //methods
55
56 /// Adds all damage amounts and returns the result.
57 public method totalDamage takes nothing returns real
58 local real result = 0.0
59 local integer i = 0
60 loop
61 exitwhen (i == this.m_damageSources.size())
62 set result = result + this.m_damageAmounts[i]
63 set i = i + 1
64 endloop
65 return result
66 endmethod
67
68 public method enable takes nothing returns nothing
69 debug if (IsTriggerEnabled(this.m_damageTrigger)) then
70 debug call this.print("Damage trigger has already been enabled before.")
71 debug return
72 debug endif
73 call EnableTrigger(this.m_damageTrigger)
74 endmethod
75
76 public method disable takes nothing returns nothing
77 debug if (not IsTriggerEnabled(this.m_damageTrigger)) then
78 debug call this.print("Damage trigger has already been disabled before.")
79 debug return
80 debug endif
81 call DisableTrigger(this.m_damageTrigger)
82 endmethod
83
84 public method isEnabled takes nothing returns boolean
85 return IsTriggerEnabled(this.m_damageTrigger)
86 endmethod
87
88 public method setEnabled takes boolean enabled returns nothing
89 if (enabled) then
90 call this.enable()
91 else
92 call this.disable()
93 endif
94 endmethod
95
96 debug private method checkIndex takes integer index returns nothing
97 debug if (index < 0 or index >= this.m_damageSources.size()) then
98 debug call this.print("Wrong index: " + I2S(index) + ".")
99 debug endif
100 debug endmethod
101
102 private static method triggerActionDamaged takes nothing returns nothing
103 local trigger triggeringTrigger = GetTriggeringTrigger()
104 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
105 debug if (this.m_damageSources.size() >= AIntegerVector.maxSize()) then
106 debug call this.print("Damage source maximum has already been reached.")
107 debug endif
108 call this.m_damageSources.pushBack(GetEventDamageSource())
109 call this.m_damageAmounts.pushBack(GetEventDamage())
110 if (this.m_onDamageAction != 0) then
111 call this.m_onDamageAction.execute(this)
112 endif
113 set triggeringTrigger = null
114 endmethod
115
116 private method createDamageTrigger takes nothing returns nothing
117 local event triggerEvent
118 local triggeraction triggerAction
119 set this.m_damageTrigger = CreateTrigger()
120 set triggerEvent = TriggerRegisterUnitEvent(this.m_damageTrigger, this.m_target, EVENT_UNIT_DAMAGED)
121 set triggerAction = TriggerAddAction(this.m_damageTrigger, function thistype.triggerActionDamaged)
122 call AHashTable.global().setHandleInteger(this.m_damageTrigger, "this", this)
123 set triggerEvent = null
124 set triggerAction = null
125 endmethod
126
127 public static method create takes unit target returns thistype
128 local thistype this = thistype.allocate()
129 debug if (target == null) then
130 debug call this.print("Target is null.")
131 debug endif
132 //dynamic members
133 set this.m_onDamageAction = 0
134 //start members
135 set this.m_target = target
136 //members
137 set this.m_damageSources = AUnitVector.create()
138 set this.m_damageAmounts = ARealVector.create()
139
140 call this.createDamageTrigger()
141 return this
142 endmethod
143
144 private method destroyDamageTrigger takes nothing returns nothing
145 call AHashTable.global().destroyTrigger(this.m_damageTrigger)
146 set this.m_damageTrigger = null
147 endmethod
148
149 public method onDestroy takes nothing returns nothing
150 //start members
151 set this.m_target = null
152 //members
153 call this.m_damageSources.destroy()
154 call this.m_damageAmounts.destroy()
155
156 call this.destroyDamageTrigger()
157 endmethod
158 endstruct
159
160 endlibrary
161